home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / gemxx19.zoo / gem++19 / example / example.cc < prev    next >
C/C++ Source or Header  |  1993-11-21  |  33KB  |  1,550 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  example
  4. //
  5. //  This file demonstrates many of the features of the gem++ library.
  6. //
  7. /////////////////////////////////////////////////////////////////////////////
  8. //
  9. //  This file is Copyright 1992 by Warwick W. Allison,
  10. //  and is freely distributable providing no charge is made.
  11. //
  12. /////////////////////////////////////////////////////////////////////////////
  13.  
  14. #include "gem++.h"
  15. #include "example.h"
  16. #include "scancode.h"
  17. #include <time.h>
  18. #include <string.h>
  19. #include <support.h>
  20. #include <stdlib.h>
  21. #include <vt52.h>
  22.  
  23. #define FIS_HOLLOW 0
  24. #define FIS_SOLID 1
  25. #define FIS_PATTERN 2
  26. #define FIS_HATCH 3
  27. #define FIS_USER 4
  28.  
  29.  
  30. //
  31. // Demonstrates a simple derived class of GEMobject
  32. //
  33. // Objects of this class will become Checked when clicked upon.
  34. //
  35. class MenuItemToggle : public GEMobject {
  36. public:
  37.     MenuItemToggle(GEMform& form, int RSCindex) :
  38.         GEMobject(form,RSCindex)
  39.     {
  40.     }
  41.  
  42.     GEMfeedback Touch(int x, int y, const GEMevent& e)
  43.     {
  44.         Checked(bool(!Checked()));
  45.         Deselect();
  46.         Redraw();
  47.         return ContinueInteraction;
  48.     }
  49. };
  50.  
  51.  
  52. static char* monthtext[12]={"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"};
  53.  
  54. //
  55. // Demonstrates GEMtimer and GEMhotform used for popup menus.
  56. //
  57. // This class encapsulates all the RSCindices required to setup
  58. // the clock, so only of of these objects could be created, since
  59. // they use the single graphics in the GEMrsc.  See the GEMringfiw
  60. // below for a more complex example that allows duplicates.
  61. //
  62. // This class has quite a few components...
  63. //
  64. //  - it is a GEMformwindow with no window-parts, so it is a form
  65. //       in a window.
  66. //  - it is a GEMtimer, so its Expire() method is called at the intervals
  67. //       requested with Interval().
  68. //  - it is a GEMobject based on the GRABBER object, so its Touch() method
  69. //       is called when the GRABBER is touched.
  70. //  - it has two GEMtextobjects, timetext and datetext, which we can just
  71. //       treat as if they are char*'s since they have conversion operators.
  72. //  - it has a GEMhotform, popup, used for a pop-up menu.
  73. //  - it has a MenuItemToggle (defined above), gmt, which is in the popup
  74. //       menu, and which we test the Checked() state of when deciding to
  75. //       use local or Greenwich time.
  76. //  - it has a GEMalert, gmjoke, which makes the whole GMT thing worthwhile.
  77. //
  78. // The member functions are described within.
  79. //
  80. class Clock : public GEMformwindow, GEMtimer, GEMobject {
  81. public:
  82.     Clock(GEMactivity& act, const GEMrsc& rsc) :
  83.         GEMformwindow(act,rsc,CLOCK,0),
  84.         GEMtimer(act,0), // Initially interval==0, ie. Expire() immediately.
  85.         GEMobject(*this,GRABBER),
  86.         timetext(*this,TIME),
  87.         datetext(*this,DATE),
  88.         popup(rsc,POPUP),
  89.         gmt(popup,GMT),
  90.         gmjoke(rsc,GMJOKE)
  91.     {
  92.         strcpy(timetext,"    ");
  93.         strcpy(datetext,"     ");
  94.     }
  95.  
  96. private:
  97.  
  98.     // The Update() method gets the local time or Greenwich time, according
  99.     // to whether the gmt GEMobject is Checked.  It then sets the timetext
  100.     // and datetext strings (they are actually GEMtextobjects).  It then
  101.     // Redraws those strings.  Update() is a local member, called by the
  102.     // methods below it.
  103.     //
  104.     void Update()
  105.     {
  106.         time_t ti=time(0);
  107.         tm* T;
  108.         if (gmt.Checked())
  109.             T=gmtime(&ti);
  110.         else
  111.             T=localtime(&ti);
  112.         timetext[0]=T->tm_hour/10 ? T->tm_hour/10+'0' : ' ';
  113.         timetext[1]=T->tm_hour%10+'0';
  114.         timetext[2]=T->tm_min/10+'0';
  115.         timetext[3]=T->tm_min%10+'0';
  116.         strncpy(datetext,monthtext[T->tm_mon],3);
  117.         datetext[3]=T->tm_mday/10 ? T->tm_mday/10+'0' : ' ';
  118.         datetext[4]=T->tm_mday%10+'0';
  119.         if (IsOpen()) {
  120.             timetext.Redraw();
  121.             datetext.Redraw();
  122.         }
  123.     }
  124.  
  125. protected:
  126.  
  127.     // The Expire() method overrides that inherited from GEMtimer.
  128.     // It is called when the interval expires.  Its action it
  129.     // to merely Update the time and wait set the interval to
  130.     // be 60000 milliseconds.  We only need to reset the interval
  131.     // because when we created the object, we requested the interval
  132.     // to be 0 so that the Expire (and hence Update) would be
  133.     // immediate.
  134.     //
  135.     virtual GEMfeedback Expire(const GEMevent&)
  136.     {
  137.         Update();
  138.         Interval(60000); // Every minute, approx.
  139.         return ContinueInteraction;
  140.     }
  141.  
  142.     // The Touch() method overrides that inheritted from GEMobject.
  143.     // It is called whenever the user touches the GRABBER object
  144.     // on which the object was defined.
  145.     //
  146.     // If the touch is made using the right button (button 1), the
  147.     // popup menu is displayed.  If the exitor of the popup is
  148.     // the "close" menuitem, the Close() method inheritted from
  149.     // GEMformwindow is called.  If the exitor is the smiley-face
  150.     // icon (DOGMJOKE, that's Do-GM-joke), the gmjoke alert is
  151.     // popped up.  If the exitor is the "quit" menuitem, EndInteraction
  152.     // is returned, ending the GEMactivity.Do() loop.  Note that
  153.     // the "GMT" menuitem is handled by using the Touch() method of
  154.     // MenuItemToggle as described above.
  155.     //
  156.     // If the touch is not made by the right button, we employ a bit
  157.     // of AES code (hmm, maybe that ugly stuff needs a class) to drag
  158.     // a box the size of the BorderRect of this window, then we
  159.     // GEMformwindow::Move this window to that dragged location.
  160.     //
  161.     virtual GEMfeedback Touch(int x, int y, const GEMevent& e)
  162.     {
  163.         if (e.Button(1)) {
  164.             switch (popup.Do(e.X(),e.Y())) {
  165.              case QCLOCK:
  166.                 Close();
  167.             break; case DOGMJOKE:
  168.                 gmjoke.Alert();
  169.             break; case QPROG:
  170.                 return EndInteraction;
  171.             }
  172.             Update();
  173.             return ContinueInteraction;
  174.         } else {
  175.             int bx,by,bw,bh;
  176.             int nx,ny;
  177.             wind_get(0,WF_WORKXYWH,&bx,&by,&bw,&bh);
  178.             GRect w=BorderRect();
  179.             graf_dragbox(w.g_w,w.g_h,w.g_x,w.g_y,bx,by,bw,bh,&nx,&ny);
  180.  
  181.             GEMformwindow::Move(nx,ny);
  182.  
  183.             return ContinueInteraction;
  184.         }
  185.     }
  186.  
  187. private:
  188.     GEMtextobject timetext,datetext;
  189.     GEMhotform popup;
  190.     MenuItemToggle gmt;
  191.     GEMalert gmjoke;
  192. };
  193.  
  194. //
  195. // Demonstrates GEMvdiobject
  196. //
  197. class GEMliney : public GEMvdiobject {
  198. public:
  199.     GEMliney(GEMform& form, int RSCindex, VDI& vdi) :
  200.         GEMvdiobject(form,RSCindex,vdi)
  201.     {
  202.     }
  203.  
  204. protected:
  205.     virtual void Draw(int x, int y)
  206.         {
  207.             int j=Width() < Height() ? Width() : Height();
  208.             for (int i=0; i<j; i+=3) {
  209.                 vdi.line(x,y+j-i,x+i,y);
  210.             }
  211.         }
  212. };
  213.  
  214. //
  215. // Demonstrates GEMvdiobject, with special "Selected" state display.
  216. //
  217. class GEMellipse : public GEMvdiobject {
  218. public:
  219.     GEMellipse(GEMform& form, int RSCindex, VDI& vdi) :
  220.         GEMvdiobject(form,RSCindex,vdi)
  221.     {
  222.     }
  223.  
  224. protected:
  225.     virtual void Draw(int x, int y)
  226.         {
  227.             vdi.sf_interior(FIS_PATTERN);
  228.             if (Selected()) vdi.sf_style(20);
  229.             else vdi.sf_style(10);
  230.             vdi.ellipse(x+Width()/2,y+Height()/2,Width()/2,Height()/2);
  231.         }
  232. };
  233.  
  234. //
  235. // Demonstrates that GEMuserobjects (and GEMvdiobjects) retain
  236. // the features of the object that is having its display representation
  237. // redefined.
  238. //
  239. class GEMroundbutton : public GEMvdiobject {
  240. private:
  241.     int texth;
  242.  
  243. public:
  244.     GEMroundbutton(GEMform& f, int RSCindex, VDI& v) :
  245.         GEMvdiobject(f,RSCindex,v)
  246.     {
  247.         int j;
  248.         graf_handle(&j,&texth,&j,&j);
  249.     }
  250.  
  251. protected:
  252.     virtual void Draw(int x, int y)
  253.         {
  254.             if (Selected()) vdi.sf_interior(1);
  255.             else vdi.sf_interior(0);
  256.             vdi.rfbox(x,y,x+Width()-1,y+Height()-1);
  257.             vdi.swr_mode(MD_XOR);
  258.             int j;
  259.             vdi.st_alignment(1,3,&j,&j); // Centre-Bottom aligned
  260.             vdi.gtext(x+Width()/2,y+(Height()+texth)/2-1,Text());
  261.             vdi.swr_mode(MD_REPLACE);
  262.         }
  263. };
  264.  
  265.  
  266. //
  267. // Demonstrates various GEMobjects, and the GEMformiconwindow
  268. //
  269. class Various : public GEMformiconwindow {
  270. public:
  271.     Various(GEMactivity& in, const GEMrsc& rsc) :
  272.         GEMformiconwindow(in,rsc,VARIOUS,VARIOUSI),
  273.         image("example.img"),
  274.         picture(*this,PIC,image),
  275.         panner(*this,PANKNOB,PANRACK,PANLEFT,PANRIGHT,PANUP,PANDOWN),
  276.         vertslider(*this,VKNOB,VRACK,UP,DOWN),
  277.         horzslider(*this,HKNOB,HRACK,LEFT,RIGHT),
  278.         vdi(),
  279.         ellipse(*this,ELLIPSE,vdi),
  280.         liney(*this,LINEY,vdi),
  281.         r1(*this,RBUT1,vdi),
  282.         r2(*this,RBUT2,vdi)
  283.     {
  284.         SetName(" Various GEM++ objects ");
  285.     }
  286.  
  287. private:
  288.     IMG image;
  289.     GEMimageobject picture;
  290.     GEMslider panner;
  291.     GEMslider vertslider;
  292.     GEMslider horzslider;
  293.     VDI vdi;
  294.     GEMellipse ellipse;
  295.     GEMliney liney;
  296.     GEMroundbutton r1;
  297.     GEMroundbutton r2;
  298. };
  299.  
  300.  
  301. class GEMvditextobject : public GEMvdiobject {
  302. public:
  303.     GEMvditextobject(GEMform& f, int RSCindex, VDI& v) :
  304.         GEMvdiobject(f,RSCindex,v)